package com.wtgroup.demo.leetcode.q006;

/**
 * @author dafei
 * @version 0.1
 * @date 2021/3/23 14:24
 */
public class S_My {

    /**
     *
     * 周期: 一个周期定义为 一个完整列 和 (行数-2)个单点列. 即 Z 的横+撇.
     * |/|/|/|/ 4个周期
     */
    public String convert(String s, int numRows) {
        if (numRows==1) {
            return s;
        }

        int n = s.length();
        int numCols = 0 /*单点散列*/;
        // 一个周期元素个数
        int oneEleNum = 2 * numRows - 2;
        // 一个周期的列数
        int oneColNum = numRows - 1;
        // 元素总个数即字符串长度.
        // 1) 除以周期元素数; 2) 余数再除以行数.
        numCols = (n / oneEleNum) * oneColNum /*周期数×单周期列数*/
                + (n % oneEleNum) / numRows /*单个满列*/
                + ((n % oneEleNum) / numRows == 0 ? 1 : (n % oneEleNum) % numRows);

        char[][] tmp = new char[numRows][numCols];
        boolean reverse = false;
        int r = 0, c = 0;
        for (int i = 0; i < s.length(); i++) {
            if(reverse) {
                tmp[r][c] = s.charAt(i);
                if (r==0) {
                    reverse = false;
                    r++;
                } else {
                    r--; c++;
                }
            } else {
                tmp[r][c] = s.charAt(i);
                if (r==numRows-1) {
                    // 达到最低行, 方向逆转
                    reverse = true;
                    r--; c++;
                } else {
                    r++; // 行增, 列不动
                }
            }
        }

        // // 打印看效果
        // print(numRows, numCols, tmp);

        return output(numRows, numCols, tmp);
    }

    private String output(int numRows, int numCols, char[][] tmp) {
        String ans = "";
        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j < numCols; j++) {
                char c1 = tmp[i][j];
                if (c1>0) {
                    ans += c1;
                }
            }
        }

        return ans;
    }

    // TEST
    private void print(int numRows, int numCols, char[][] tmp) {
        for (int i = 0; i < numRows; i++) {
            for (int j = 0; j < numCols; j++) {
                char c1 = tmp[i][j];
                System.out.print(c1);
                System.out.print(" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        String s = "PAYPALISHIRING";
        // String s = "A";
        System.out.println(new S_My().convert(s, 1));
    }
}
